<?php
class Router extends Zend_Controller_Router_Route
{
    const OBJECTID = 'objectId';
    const REGIONS = 'regions';
    
    public $variableMap = array();    
    protected $_protectedVars = array('module', 'action', 'controller');
    
    public function match($path)
    {   
        $path = parent::match($path); 
        
        //обрабатываем особым случаем id объекта
        $path = $this->_specialCaseObjectId($path);        
        $path = $this->bindParams($path);
        
        //обрабатываем особым случаем Город
        $path = $this->_specialCaseCity($path);
        return $path;
    }
    
    /*
     * Находим переменные по значению в массиве и биндим если найдены
     */
    public function bindParams($params, $variables = array())
    {                
        foreach(count($variables)?$variables:$this->variableMap as $var => $data)
        {
            foreach($params as $key => $value)
            {
                if(!$key) continue;
                if($value && $this->_find($value, $data)) $params[$var] = $value;             
                if($this->_find($key, $data)) $params[$var] = $key;              
            }
        }        
   
        return $params;
    }
    
    protected function _specialCaseCity($params)
    {
        if(isset($params['city']) && $params['city'])
        {
            $this->_variableMaps[self::REGIONS] = getRegions($params['city']);
            return $this->bindParams($params, array(self::REGIONS => $this->_variableMaps[self::REGIONS]));
        }
        
        return $params;
    }
   
    protected function _specialCaseObjectId($params)
    {
        $data = $this->_wildcardData;
        $id = 0;
        
        if(is_null(end($data)))
        {
            $id = end(array_keys($data));
        }
        else
        {
            $id = (int)end($data);  
        }
        
        if((int)$id) $params[self::OBJECTID] = $id;
        return $params;
    }
    
    protected function _find($needle, $haystack)
    {
        return in_array($needle, $haystack);
    }
    
    /*
     * Добавляет переменные в карту переменных роутера
     */
    public function addVariableMap($data = array())
    {
        $this->variableMap = array_merge($this->variableMap, $data);
        return $this;
    }
}
